iT邦幫忙

2024 iThome 鐵人賽

DAY 11
1
JavaScript

PM說: RD大大,這個功能要怎麼寫啊?系列 第 11

PM 說: 嵌入Youtube影片可以監聽播放完畢嗎?

  • 分享至 

  • xImage
  •  

前言

PM: RD大大,客戶又有一個神奇的需求
我: (`・ω・´)
PM: 就是希望在前台嵌入Youtube影片,影片播放完畢要做統計
我: ┳━┳ノ( OωOノ) 好...我來研究

拆解問題

我們都知道Youtube可以用iframe嵌入影片,那問題是怎麼知道他已經撥放完畢了?
經爬文後才知道,只能使用youtube_iframe_api 透過載入script來實現,普通的iframe做不到(就算用MutationObserver監聽屬性也無效)

文件: https://developers.google.com/youtube/player_parameters?hl=zh-tw

當前端能實現監聽YT影片撥放完畢之後就是靠API統計資料了~(就看客戶想統計規則和頻率)

成果

讀者們可以撥放 "進階" 的影片,看看撥放完畢後的效果
demo網頁
demo

程式碼

<!DOCTYPE html>
<html lang="zh-TW">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Embed YouTube Video Demo</title>
  </head>
  <body>
    <h2>普通</h2>
    <iframe
      id="ytplayer"
      type="text/html"
      width="320"
      height="180"
      src="https://www.youtube.com/embed/M7lc1UVf-VE?autoplay=1&origin=http://example.com"
      frameborder="0"
    ></iframe>
    <hr />
    <h2>進階</h2>
    <div id="myYTplayer" class="film"></div>

    <script>
      let player;
      function onYouTubeIframeAPIReady() {
        player = new window.YT.Player("myYTplayer", {
          height: "360",
          width: "640",
          videoId: "lg5WKsVnEA4", // 在此替換成你要播放的影片ID (只能是影片 非short)
          playerVars: {
            autoplay: 1, //自動撥放
            controls: 1, //播放器控制項
            fs: 0, //fullscreen 縮寫
            rel: 0, // 影片結束後不顯示推薦影片
          },

          events: {
            onReady: onPlayerReady,
            onStateChange: onPlayerStateChange,
          },
        });
      }

      // 監聽播放狀態變更事件
      function onPlayerStateChange(event) {
        console.log(event.data, YT.PlayerState);
        if (event.data === YT.PlayerState.ENDED) {
          // 播放完畢時觸發
          alert("播放完畢");
        }
      }

      function onPlayerReady(event) {

      }
    </script>
    <script src="https://www.youtube.com/iframe_api"></script>
  </body>
</html>


重點

載入 YT iframe_api 後要知道幾件事情

1. 產生影片

new window.YT.Player(`$標籤id字串`, `$參數`)

$參數重點講解我認為重要的playerVars

  • 如果想要自動撥放
    • autoplay:1
      • 使用者要和網頁先互動過才生效,否則無作用(這個瀏覽器機制會在明天補充)
  • 如果想要關閉推薦影片
    • rel: 0
      • 影片撥放完畢會列出推薦影片影響體驗
  • 如果想禁用全螢幕功能
    • fs: 0
      • 如果希望影片撥放完畢後彈出model,這個要記的加上,否則fullscreen看不到model
  • 如果想要顯示播放器控制項
    • controls: 1
      • 若為0則無法控制進度條&齒輪,字幕等底部功能

2. onYouTubeIframeAPIReady

若全域宣告一個方法window.onYouTubeIframeAPIReady
iframe_api載入完成後會馬上被呼叫
適合時機: 載入網站時馬上要動態生成嵌入的影片

不然其實點縮圖的時候再靠 click 事件產生就好
縮圖範例:
yt-img

3. onStateChange(event)

event.data會拿到影片狀態數字

這邊列出不同狀態的意思

YT.PlayerState = {
    "UNSTARTED": -1, //未開始
    "ENDED": 0, //撥放完畢
    "PLAYING": 1, //撥放中
    "PAUSED": 2, //暫停
    "BUFFERING": 3, //載入中
    "CUED": 5 //影片被指派或載入後,尚未開始播放
}

4. onReady(event)

影片載入好觸發
如果希望在影片載入好,馬上關閉聲音可以這樣寫:

      function onPlayerReady(event) {
        event.target.mute();
      }

補充

影片縮圖可以使用 https://i.ytimg.com

參考:
https://electrify.tw/archives/355/youtube-thumbnail-downloader/


上一篇
PM 說: 可以嵌入其他人的網頁並控制滾動軸嗎?
下一篇
PM 說: 為什麼網頁不能一開啟就自動播放聲音?
系列文
PM說: RD大大,這個功能要怎麼寫啊?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言